package br.com.veterinariavillage.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import br.com.veterinariavillage.model.Cliente;

public class DAOCliente implements IDAOCliente {

	Connection conexao = GenericDao.getConnection();

	@Override
	public ArrayList<Cliente> localizar() {
		ArrayList<Cliente> listaCliente = new ArrayList<Cliente>();
		ResultSet rs = null;
		try{
			PreparedStatement ps = conexao.prepareStatement(" select cod_cliente, nome, cpf, email, endereco, telefone, datanasc " +
															" from Cliente ");
			ps.execute();
			rs = ps.getResultSet();
			while (rs.next()){
				Cliente cliente = new Cliente();
				cliente.setCodigo(rs.getInt("cod_cliente"));
				cliente.setNome(rs.getString("nome"));
				cliente.setEmail(rs.getString("email"));
				cliente.setCpf(rs.getString("cpf"));
				cliente.setEndereco(rs.getString("endereco"));
				cliente.setTelefone(rs.getString("telefone"));
				cliente.setDataNascimento(rs.getDate("datanasc"));
				listaCliente.add(cliente);
			}
			ps.close();
		}catch (Exception e){
			e.printStackTrace();
		}
		return listaCliente;
	}

	@Override
	public ArrayList<Cliente> localizarPorNome(String nome) {
		ArrayList<Cliente> listaCliente = new ArrayList<Cliente>();
		ResultSet rs = null;
		try{
			PreparedStatement ps = conexao.prepareStatement(" select cod_cliente, nome, cpf, email, endereco, telefone, datanasc " +
															" from Cliente where UPPER(nome) like UPPER(?+'%') ");
			ps.setString(1, nome);
			ps.execute();
			rs = ps.getResultSet();
			while (rs.next()){
				Cliente cliente = new Cliente();
				cliente.setCodigo(rs.getInt("cod_cliente"));
				cliente.setNome(rs.getString("nome"));
				cliente.setEmail(rs.getString("email"));
				cliente.setCpf(rs.getString("cpf"));
				cliente.setEndereco(rs.getString("endereco"));
				cliente.setTelefone(rs.getString("telefone"));
				cliente.setDataNascimento(rs.getDate("datanasc"));
				listaCliente.add(cliente);
			}
			ps.close();
		}catch (Exception e){
			e.printStackTrace();
		}
		
		return listaCliente;
	}

	@Override
	public Cliente localizarPorCpf(String cpf) {
		Cliente cliente = null;
		ResultSet rs = null;
		try{
			PreparedStatement ps = conexao.prepareStatement(" select cod_cliente, nome, cpf, email, endereco, telefone, datanasc " +
															" from Cliente where cpf = ? ");
			ps.setString(1, cpf);
			ps.execute();
			rs = ps.getResultSet();
			while (rs.next()){
				cliente = new Cliente();
				cliente.setCodigo(rs.getInt("cod_cliente"));
				cliente.setNome(rs.getString("nome"));
				cliente.setEmail(rs.getString("email"));
				cliente.setCpf(rs.getString("cpf"));
				cliente.setEndereco(rs.getString("endereco"));
				cliente.setTelefone(rs.getString("telefone"));
				cliente.setDataNascimento(rs.getDate("datanasc"));
			}
			ps.close();
		}catch (Exception e){
			e.printStackTrace();
		}
		
		return cliente;
	}

	@Override
	public void inserir(Cliente c) {
		try{
			PreparedStatement ps = conexao.prepareStatement("insert into Cliente(nome, cpf, email, endereco, telefone, datanasc) values (?,?,?,?,?,?)");
			ps.setString(1, c.getNome());
			ps.setString(2, c.getCpf());
			ps.setString(3, c.getEmail());
			ps.setString(4, c.getEndereco());
			ps.setString(5, c.getTelefone());
			java.sql.Date dataNascimento = null;
			if(c.getDataNascimento() != null) 
				dataNascimento = new java.sql.Date(c.getDataNascimento().getTime());
			ps.setDate(6, dataNascimento);
			ps.execute();
			ps.close();
		}catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void atualizar(Cliente c) {
		try{
			PreparedStatement ps = conexao.prepareStatement("update Cliente set nome = ?, cpf = ?, email = ?, endereco = ?, telefone = ?, datanasc = ? where cod_cliente = ?");
			ps.setString(1, c.getNome());
			ps.setString(2, c.getCpf());
			ps.setString(3, c.getEmail());
			ps.setString(4, c.getEndereco());
			ps.setString(5, c.getTelefone());
			java.sql.Date dataNascimento = null;
			if(c.getDataNascimento() != null) 
				dataNascimento = new java.sql.Date(c.getDataNascimento().getTime());
			ps.setDate(6, dataNascimento);
			ps.setInt(7, c.getCodigo());
			ps.execute();
			ps.close();
		} catch(Exception e){
			e.printStackTrace();
		}
	}

	@Override
	public void excluir(Cliente c) {
		try{
			PreparedStatement ps = conexao.prepareStatement("delete Cliente where cod_cliente = ?");
			ps.setInt(1,c.getCodigo());
			ps.execute();
			ps.close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	@Override
	public Cliente localizar(int codigo) {
		Cliente cliente = null;
		ResultSet rs = null;
		try{
			PreparedStatement ps = conexao.prepareStatement(" select cod_cliente, nome, cpf, email, endereco, telefone, datanasc " +
															" from Cliente where cod_cliente = ? ");
			ps.setInt(1, codigo);
			ps.execute();
			rs = ps.getResultSet();
			while (rs.next()){
				cliente = new Cliente();
				cliente.setCodigo(rs.getInt("cod_cliente"));
				cliente.setNome(rs.getString("nome"));
				cliente.setEmail(rs.getString("email"));
				cliente.setCpf(rs.getString("cpf"));
				cliente.setEndereco(rs.getString("endereco"));
				cliente.setTelefone(rs.getString("telefone"));
				cliente.setDataNascimento(rs.getDate("datanasc"));
			}
			ps.close();
		}catch (Exception e){
			e.printStackTrace();
		}
		
		return cliente;
	}

}
